/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pessoas.strategyFontesImportacao;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import pessoas.interfaces.IFonteImportacao;
import pessoas.model.Contato;
import pessoas.serializacao.serializacaoArquivo;

/**
 *
 * @author Bush
 */
public class Arquivo implements IFonteImportacao {

    private String caminho;
    private int numLinhas;
    private ArrayList<Contato> contatos;
    private serializacaoArquivo serializacao;

    public Arquivo() {
        serializacao = new serializacaoArquivo();
        numLinhas = 0;
        contatos = new ArrayList<Contato>();
    }

    @Override
    public ArrayList<Contato> contatosImportados() {        
        try {
            lerXML(importarXML(caminho));
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }

        return contatos;
    }
   
    public String importarXML(String link) throws FileNotFoundException, Exception {
        File caminho = new File(link);
        Scanner scan = new Scanner(caminho);
        String linha = "";

        long inicio = System.currentTimeMillis();
        long fim = System.currentTimeMillis();
        while (scan.hasNextLine()){// && (fim - inicio) < 3000) {
            linha += scan.nextLine();
            fim = System.currentTimeMillis();
            numLinhas++;
        }
        if (fim - inicio > 3000) {
            throw new Exception("Excedeu tempo limite de Importação");
        }
        linha = linha.replace("<contatos>", "<list>");
        linha = linha.replace("<contato>", "<pessoas.model.Contato>");
        linha = linha.replace("<Nome>", "<nome>");
        linha = linha.replace("<Telefone>", "<telefone>");
        linha = linha.replace("<Id>", "<id>");
        linha = linha.replace("</contatos>", "</list>");
        linha = linha.replace("</contato>", "</pessoas.model.Contato>");
        linha = linha.replace("</Nome>", "</nome>");
        linha = linha.replace("</Telefone>", "</telefone>");
        linha = linha.replace("</Id>", "</id>");
        linha = linha.replace(") ", ")");
        return linha;
    }

    public void lerXML(String xml) throws Exception {

        XStream parser = new XStream(new DomDriver());
        parser.setMode(XStream.NO_REFERENCES);

        ArrayList<Contato> listaXML = (ArrayList<Contato>) parser.fromXML(xml);
        contatos = separaSobrenome(listaXML);

    }

    public ArrayList<Contato> separaSobrenome(ArrayList<Contato> lista) {
        for (int i = 0; i < lista.size(); i++) {
            if (lista.get(i).getSobrenome() == null) {
                String nomes[] = lista.get(i).getNome().split(" ");
                lista.get(i).setNome(nomes[0]);
                lista.get(i).setSobrenome(nomes[1]);
                if (nomes.length > 2) {
                    String sobre = "";
                    for (int j = 1; j < nomes.length; j++) {
                        sobre += nomes[j] + " ";
                    }
                    lista.get(i).setSobrenome(sobre);
                }
            }
        }
        return lista;
    }

    @Override
    public int numeroLinhas() {
        return numLinhas;
    }

    @Override
    public int tamanhoArquivo() {
        try {
            return serializacao.tamanhoArquivo(caminho);
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
        return 0;
    }

    @Override
    public void escolhaArquivo() {
        JFileChooser fc = new JFileChooser();
        int res = fc.showOpenDialog(null);
        try {
            if (res == JFileChooser.APPROVE_OPTION) {
                File arquivo = fc.getSelectedFile();
                caminho = arquivo.getPath();
                if (!caminho.contains(".xml")) {
                    throw new Exception("Formato invalido!\nInforme um arquivo .xml válido!");
                }
            } else {
                throw new Exception("Voce nao selecionou nenhum arquivo");
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
}
